package com.example.workflow.controller;

import com.example.workflow.dto.UpdatePassword;
import com.example.workflow.pojo.Result;
import com.example.workflow.pojo.UserInfo;
import com.example.workflow.service.UserInfoService;
import com.example.workflow.vo.LoginVo;
import com.example.workflow.vo.UserInfoVo;
import com.example.workflow.vo.UserListVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;



@CrossOrigin
@RestController
@Slf4j
@RequestMapping("/user")
// test123
public class UserController {
    @Autowired
    private UserInfoService userInfoService;

    /**
     * 登录操作
     *
     * @param userInfo 登录信息
     * @return 登录结果
     */
    @PostMapping("/Login")
    public Result<String> login(@RequestBody UserInfo userInfo) {
        log.info("登录操作");
//        log.info("userInfo: {}", userInfo);
        return userInfoService.login(userInfo);
    }

    /**
     * 登录操作
     *
     * @param userInfo 登录信息（用户名、密码）
     * @return 登录结果（包含了登录用户的角色信息）
     */
    @PostMapping("/login")
    public Result<LoginVo> Login(@RequestBody UserInfo userInfo) {
        log.info("登录操作");
        return userInfoService.Login(userInfo);
    }

    /**
     * 注册操作（只有系统管理员才能够新增用户）
     *
     * @param userInfo 注册信息
     * @return 结果
     */
    @PostMapping("/register")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<Integer> register(@RequestBody UserInfo userInfo) {
        log.info("注册操作, {}", userInfo);
        int userId = userInfoService.register(userInfo);
        if(userId!=-1) {
            return Result.success("注册成功",userId);
        }
        return Result.error("注册失败");
    }

    /**
     * 用户登出
     *
     * @return Result
     */
    @PostMapping("/logout")
    public Result<String> logout() {
        return userInfoService.logout();
    }

    /**
     * 查询全部用户
     *
     * @param
     * @return 用户列表
     */
    @GetMapping("/list")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<UserListVo> userList(@RequestParam(value = "id", required = false)Integer id,@RequestParam(value = "realName",required = false)String name, @RequestParam(value = "department",required = false) String department,@RequestParam(value = "role",required = false) String role) {
        log.info("查询，{}，{}，{}",name,department,role);
        List<UserInfoVo> userInfoVos = userInfoService.userList(id,name, department, role);
        UserListVo userListVo = new UserListVo(userInfoVos.size(), userInfoVos);
        return Result.success(userListVo);
    }

    /**
     * 更新用户密码
     *
     * @param updatePassword 更新的用户密码
     * @return
     */
    @PostMapping("/update/password")
    public Result<String> updatePassword(@RequestBody UpdatePassword updatePassword) {
        log.info("修改密码");
        return userInfoService.updatePassword(updatePassword);
    }

    @GetMapping("/details")
    public Result<UserInfo> details(@RequestParam(value = "id",required = true) Integer id) {
        log.info("查询用户 {} 的用户信息", id);
        return Result.success(userInfoService.details(id));
    }

    /**
     * 更新用户信息
     *
     * @param userInfo 更新信息
     * @return
     */
    @PostMapping("/update/info")
    public Result<String> update(@RequestBody UserInfo userInfo) {
        log.info("更新用户信息");
        userInfoService.update(userInfo);
        return Result.success();
    }

    /**
     * 删除用户信息
     *
     * @param id 删除的用户的id
     * @return
     */
    @DeleteMapping("/delete")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<String> delete(@RequestParam Integer id) {
        log.info("删除用户操作");
        userInfoService.delete(id);
        return Result.success();
    }

    /**
     * 修改用户信息
     *
     * @param userInfo 修改用户对应的信息
     * @return
     */
    @PostMapping("/modify")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<String> modify(@RequestBody UserInfo userInfo) {
        log.info("管理员修改用户信息");
        userInfoService.modify(userInfo);
        return Result.success();
    }

    /**
     * 管理员重置用户密码
     *
     * @param userInfo 用户信息
     * @return 成功信息
     */
    @PostMapping("/reset")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<Object> reset(@RequestBody UserInfo userInfo) {
        log.info("管理员重置 用户 {} 的密码",userInfo.getId());
        userInfoService.reset(userInfo.getId());
        return Result.success();
    }
}
